#include "points.h"

FILE_ *fopen_(const char *path_name, const char *mode)//打开文件操作
{
    int flag = 0;//文件操作的宏选项
    int permissions = 0666;//文件权限
    if(strcmp(mode,"r")==0)//判断对文件的操作是什么
    {
        flag |= O_RDONLY;
    }
    else if(strcmp(mode,"w")==0)
    {
        flag |= O_WRONLY | O_CREAT | O_TRUNC;
    }
    else if(strcmp(mode,"a")==0)
    {
        flag |= O_WRONLY | O_CREAT | O_APPEND;
    }
    else
    {

    }
    int fd = 0;
    if(flag & O_RDONLY) 
        fd = open(path_name,flag);
    else
        fd = open(path_name,flag,permissions);
    if(fd<0)
    {
        const char* err = strerror(errno);
        write(2,err,strlen(err));//打印错误信息
        return NULL;//这就是为什么C语言打开文件失败了会返回NULL
    }
    //到这里就是文件被打开了
    FILE_* fp =(FILE_*)malloc(sizeof(FILE_));//申请空间
    //下面进行初始化工作
    fp->flags = SYNC_LINE;//设置默认行缓冲
    fp->fileno = fd;//文件描述符
    fp->cap = SIZE;//容量初始化
    fp->size = 0;//有效数据个数初始化
    memset(fp->buffer,0,SIZE);//空间初始化

    return fp;//这里就是为什么C语言打开一个文件，返回FILE*指针
}
void fwrite_(const void *ptr, int num, FILE_ *fp)//写入操作
{
    memcpy(fp->buffer+fp->size,ptr,num);//数据写入到缓冲区中
    fp->size += num;
    //判断是否刷新
    if(fp->flags & SYNC_NOW)
    {
        write(fp->fileno,fp->buffer,fp->size);
        fp->size=0;//清空缓冲区
    }
    else if(fp->flags & SYNC_LINE)
    {
        if(fp->buffer[fp->size-1] == '\n')//不考虑abcd\nadg
        {
            write(fp->fileno,fp->buffer,fp->size);
            fp->size=0;
        }
    }
    else if(fp->flags & SYNC_FULL)
    {
        if(fp->cap == fp->size)
        {
            write(fp->fileno,fp->buffer,fp->size);
            fp->size=0;
        }
    }
    else
    {

    }
}
void fclose_(FILE_ * fp)//关闭操作
{
    fflush_(fp);//刷新
    close(fp->fileno);//关闭
}
void fflush_(FILE_ *fp)//强制刷新操作
{
    if(fp->size > 0)
        write(fp->fileno,fp->buffer,fp->size);
}
